# 对于 Series 而言，您可以把它当做一维数组进行遍历操作；
# 而像 DataFrame 这种二维数据表结构，则类似于遍历 Python 字典。

import pandas as pd
import numpy as np

N = 20
df = pd.DataFrame({
    'A': pd.date_range(start='2016-01-01', periods=N, freq='D'),
    'x': np.linspace(0, stop=N - 1, num=N),
    'y': np.random.rand(N),
    'C': np.random.choice(['Low', 'Medium', 'High'], N).tolist(),
    'D': np.random.normal(100, 10, size=(N)).tolist()
})
print(df)
for col in df:
    print(col)

# 内置迭代方法
# 如果想要遍历 DataFrame 的每一行，我们下列函数：
# 1) iteritems()：以键值对 (key,value) 的形式遍历；
# 2) iterrows()：以 (row_index,row) 的形式遍历行;
# 3) itertuples()：使用已命名元组的方式对行遍历。
df = pd.DataFrame(np.random.randn(4, 3), columns=['col1', 'col2', 'col3'])
for key, value in df.iteritems():
    print(key, value)

# 注意：iterrows() 遍历行，其中 0,1,2 是行索引而 col1,col2,col3 是列索引
for row_index, row in df.iterrows():
    print(row_index, row)

# itertuples() 同样将返回一个迭代器，该方法会把 DataFrame 的每一行生成一个元组
for row in df.itertuples():
    print(row)

# 迭代返回副本  所以，如果在迭代过程中修改元素值，不会影响原对象，这一点需要大家注意。
df = pd.DataFrame(np.random.randn(3, 3), columns=['col1', 'col2', 'col3'])
for index, row in df.iterrows():
    row['a'] = 15
print(df)
